package scalalala
//设计一个音乐播放器类MusicPlayer
//包括属性有音乐列表、当前播放的音乐、播放模式等
//并能够实现添加音乐、删除音乐、播放音乐等方法

class MusicPlayer(b:String,c:String) {
//  声明变量var 声明常量val
//  都共有的变量可以定义在伴生对象中直接调用 MusicPlayer.playlist
  var playlist: List[String] = MusicPlayer.playlist     // 音乐列表
  var currentSong: String = b         // 当前播放的音乐
  var playMode: String = c        // 播放模式

  def addSong(song: String): Unit = {
//    列表连接 ：+
    playlist = playlist :+ song       // 添加音乐到播放列表
    println("添加歌曲’"+song+"‘后的歌曲列表："+playlist)
  }

  def removeSong(song: String): Unit = {
//    filter 保留列表中符合条件p的列表元素 ， filterNot，保留列表中不符合条件p的列表元素
    playlist = playlist.filter(_ != song)  // 从播放列表中删除指定音乐
    println("删除歌曲’"+song+"‘后的歌曲列表："+playlist)
  }

  def play(): Unit = {
    currentSong = playlist.headOption.getOrElse("") // 播放列表中的第一首音乐
    println("当前正在播放第一首音乐是："+currentSong)
  }

  def next(): Unit = {
    // 根据当前播放模式选择下一首音乐
    playMode match {
      case "loop" => loopPlayNext() //循环播放
      case "shuffle" => shufflePlayNext() //随机播放
      case "single" => singlePlayNext() //单曲循环
      case _ => println("Unknown play mode!")
    }
  }

  def loopPlayNext(): Unit = {
    val index = playlist.indexOf(currentSong) // 当前音乐在播放列表中的索引
    if (index == playlist.length - 1) {       // 如果当前音乐是最后一首，则回到列表开头
      currentSong = playlist.headOption.getOrElse("")
    } else {                                   // 否则播放列表中的下一首音乐
      currentSong = playlist(index + 1)
    }
  }

  def shufflePlayNext(): Unit = {
    // 从播放列表中随机选择一首音乐作为下一首
//    将传入的集合中的"数据的顺序"重新随机生成后再返回该类型的一个新集合 Random.shuffle
    currentSong = scala.util.Random.shuffle(playlist).headOption.getOrElse("")
  }

  def singlePlayNext(): Unit = {
    // 如果是单曲播放模式，则下一次播放还是当前音乐
    // 如果当前音乐不在播放列表中，则播放列表中的第一首音乐
    if (playlist.contains(currentSong)) {
      currentSong = currentSong
    } else {
      currentSong = playlist.headOption.getOrElse("")
    }
  }
}
//伴生对象
object MusicPlayer{
    val playlist:List[String]=List("You","Are","A","Looser")
    val mc = new MusicPlayer("You","loop")
    def main(args:Array[String]): Unit ={
      println("原有的歌曲列表:"+playlist)
      mc.removeSong("You")
      mc.addSong("风")
      mc.play()
    }

}